// The Swift Programming Language
// https://docs.swift.org/swift-book
import UIKit
import SwiftUI

/*
 names ---
 
 The Fast and the Furious（首部曲官方名）
 速度相关：（高速）、speed limit（限速）、accelerate（加速）、（加速度）、speed up（提速）、slow down（减速）、breakneck speed（惊险速度）
 赛车类型：race car（赛车）、sports car（跑车）、muscle car（肌肉车）、modified car（改装车）、custom car（定制车）、street car（街车）、drift car（漂移车）、off-road vehicle（越野车）、SUV（运动型多用途汽车）
 赛车动作：（漂移）、drifting（漂移动作）、burnout（烧胎）、drag race（直线加速赛）、（赛道赛）、race against time（与时间赛跑）
 车辆部件：（发动机）、supercharger（机械增压器）、exhaust（排气管）、（轮胎）、steering wheel（方向盘）、gear shift（换挡杆）、suspension（悬挂）、nitrous （一氧化二氮，NOS）、spoiler（尾翼）
 二、场景与情节高频词（60+）
 团队与关系：team（团队）、family（家人，系列核心价值观）、crew（小队）、partner（搭档）、comrade（战友）、（敌人）、rival（对手）、friend（朋友）、brother（兄弟）、sister（姐妹）
 任务与目标：（任务）、mission （不可能的任务）、（抢劫）、robbery（抢劫行动）、rescue（营救）、save（拯救）、protect（保护）、defend（防御）、target（目标）、objective（目的）、plan（计划）、strategy（策略）
 地点与场景：（街头）、（高速公路）、（城市道路）、desert（沙漠）、jungle（丛林）、ocean（海洋，系列后期海上场景）、airport（机场）、warehouse（仓库）、（工厂）、safe house（安全屋）、race （赛道）
 情感与氛围：（兴奋）、thrill（刺激）、（肾上腺素）、danger（危险）、（风险）、courage（勇气）、bravery（勇敢）、（忠诚）、trust（信任）、betrayal（背叛）、revenge（复仇）、justice（正义）
 三、角色身份与动作行为（50+）
 角色身份：driver（司机）、race driver（赛车手）、 （街头赛车手）、leader（领袖）、agent（特工）、cop（警察）、detective（侦探）、（罪犯）、gangster（黑帮成员）、mercenary（雇佣兵）、villain（反派）、hero（英雄）
 动作行为: （赛车）、chase（追逐）、car chase（汽车追逐）、escape（逃跑）、（逃离）、fight（打架）、（徒手格斗）、shoot（射击）、fire（开火）、explode（爆炸）、crash（碰撞）、car crash（汽车碰撞）、repair（修理）、fix（修复）
 状态描述：（受伤的）、hurt（受伤的）、alive（活着的）、dead（死的）、awake（醒着的）、asleep（睡着的）、tired（累的）、（精力充沛的）、angry（生气的）、calm（冷静的）、nervous（紧张的）、confident（自信的）
 四、装备与道具（40+）
 武器装备：gun（枪）、pistol（手枪）、rifle（步枪）、shotgun（霰弹枪）、knife（刀）、bomb（炸弹）、grenade（手榴弹）、bullet（子弹）、ammo（弹药）、armor（盔甲）、bulletproof vest（防弹背心）
 工具与设备：（工具箱）、（扳手）、（锤子）、jack（千斤顶）、tire iron（轮胎扳手）、GPS（全球定位系统）、radio（对讲机）、（手持对讲机）、phone（手机）、（笔记本电脑）、camera（摄像头）
 车辆装备：、car alarm（汽车报警器）、remote control（遥控器）、tow rope（拖车绳）、fuel can（油桶）、（备用轮胎）、（急救箱）
 */


public
class FastFuriousToolbox: NSObject {
    
    /// 1000 -> 1,000 / 1000.0 -> 1,000.0
    public static func ff_firstAidKit(_ laptop: String) -> String {
        
        let free = laptop.components(separatedBy: ".")
        guard let frees = free.first else { return laptop }
        
        var tmp = ""
        var counter = 0
        
        for character in frees.reversed() {
            if counter > 0 && counter % 3 == 0 {
                tmp = "," + tmp
            }
            tmp = String(character) + tmp
            counter += 1
        }
        
        if free.count > 1 {
            return tmp + "." + free[1]
        } else {
            return tmp
        }
    }
    
    /// [string: any] -> string
    public static func ff_handToCombat(_ hand: [String: Any]) -> String {
        
        guard JSONSerialization.isValidJSONObject(hand) else {
            print("JSON Error")
            return ""
        }
        
        guard let tmp = try? JSONSerialization.data(withJSONObject: hand, options: [.withoutEscapingSlashes]) else {
            return ""
        }
        
        return String(data: tmp, encoding: .utf8) ?? ""
    }
    
    /// 12345678 -> 1234 5678
    public static func ff_spaceWalkieTalkie(_ tracker: String?) -> String {
        
        guard let tra = tracker, !tra.isEmpty else {
            return ""
        }
        
        var tmp = ""
        
        for (index, character) in tra.enumerated() {
            tmp.append(character)
            
            if (index + 1) % 4 == 0 && (index + 1) < tra.count {
                tmp.append(" ")
            }
        }
        return tmp
    }
    
    @MainActor public static func ff_mainWindow() -> UIWindow? {
        var mainWin: UIWindow?
        let scenes = UIApplication.shared.connectedScenes
        
        for sce in scenes {
            if sce.activationState == .foregroundActive,
               let windowScene = sce as? UIWindowScene {
                mainWin = windowScene.keyWindow ?? windowScene.windows.first
                if mainWin != nil { break }
            }
        }
        
        return mainWin
    }
    
    @MainActor public static func ff_showText(_ message: String, textColor: UIColor = .white, textFont: UIFont = .systemFont(ofSize: 16)) {
        FFSimpleTextPopup(message, textColor: textColor, textFont: textFont).show()
    }
    
    
    /// AES
    /// - Parameters:
    ///   - str: string
    ///   - key: 32
    /// - Returns: aes + str
    public static func ff_AES_encryptStr(_ str: String, key: String) -> String {
        return FFullAESSpeed.encrypt(plaintext: str , key: key)
    }
    
    /// AES
    /// - Parameters:
    ///   - str: aes + str
    ///   - key: 32
    /// - Returns: str
    public static func ff_AES_decryptStr(_ str: String, key: String) -> String {
        return FFullAESSpeed.decrypt(ciphertext: str, key: key)
    }
    
    
    ///
    /// - Parameters:
    ///   - reality: dict
    ///   - certain: dict
    ///   - tires: en, es
    ///   - drive: app
    ///   - fast: sa
    ///   - tcriminal: token
    ///   - ustreet: user
    ///   - supercar: type
    /// - Returns: dict
    @MainActor public static func ff_screwdriverHammer(_ reality: [String: Any],
                                                       certain: [String: String],
                                                       tires: String,
                                                       drive: String,
                                                       fast: String,
                                                       tcriminal: String,
                                                       ustreet: String,
                                                       supercar: ToolBoxSupercar) -> [String: Any] {
        
        return FFExcitement().screwdriverHammer(reality, certain: certain, tires: tires, drive: drive, fast: fast, tcriminal: tcriminal, ustreet: ustreet, supercar: supercar)
    }
    
    // image (ya suo)
    public static func ff_image(_ racer: UIImage, fuel: Int = 600, tank: Int = 200) -> Data? {
        return FFDecelerate().machinePart(racer, fuel: fuel, tank: tank)
    }
    
    @MainActor public static func ff_turbochargerWrench(weekname: String, israce: Bool = false, hear: @escaping (()->Void)) {
        FFRiskTrack.rim.showRank(weekname: weekname, israce: israce) {
            hear()
        }
    }
    
    @MainActor public static func ff_loyaltyNetwork(_ flee: @escaping ((Bool)->Void)) {
        FFCityRoadNetwork.net.mission = { box in
            flee(box)
        }
    }
    
    
    /// - Parameters:
    ///   - engine: order state int
    ///   - oxide: oxide: en， es
    ///   - ally: applydate
    ///   - enemy: duedata
    ///   - attack: loandata
    ///   - hideout: repaydate
    /// - Returns: FFRaceModel
    public static func ff_raceAcceleration(engine: Int, oxide: String, ally: String, enemy: String, attack: String, hideout: String) -> FFRaceModel {
        return FFStreetRace().acceleration(engine, oxide: oxide, ally: ally, enemy: enemy, attack: attack, hideout: hideout)
    }
}






/// MARK - extension

/// Color
extension Color {
    
    public init(_ hex: String) {
        var tmp = hex.trimmingCharacters(in: .whitespacesAndNewlines)
        if tmp.hasPrefix("#") {
            tmp.remove(at: tmp.startIndex)
        }
        
        guard tmp.count == 6 else {
            self.init(white: 1.0)
            return
        }
        
        var rgbValue: UInt64 = 0
        Scanner(string: tmp).scanHexInt64(&rgbValue)
        
        let red = Double((rgbValue & 0xFF0000) >> 16) / 255.0
        let green = Double((rgbValue & 0x00FF00) >> 8) / 255.0
        let blue = Double(rgbValue & 0x0000FF) / 255.0
        
        self.init(red: red, green: green, blue: blue)
    }
}

/// UIColor
extension UIColor {
    
    public convenience init(hex: String, alpha: CGFloat = 1.0) {
        var tmp = hex.trimmingCharacters(in: .whitespacesAndNewlines)
        tmp = tmp.replacingOccurrences(of: "#", with: "")
        
        var rgb: UInt64 = 0
        Scanner(string: tmp).scanHexInt64(&rgb)
        
        let red = CGFloat((rgb & 0xFF0000) >> 16) / 255.0
        let green = CGFloat((rgb & 0x00FF00) >> 8) / 255.0
        let blue = CGFloat(rgb & 0x0000FF) / 255.0
        
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
}


public
struct FFRaceModel {
    public var brakesText: String
    public var brakesValue: String
    
    public var rubberText: String
    public var rubberValue: String
}
